#include<bits/stdc++.h>
using namespace std;
const int MAXN=100010,INF=100000000;
int n,cnt,ans,root,last,ret,tot,totdel,cou;
bool lastt;
struct temp
{
	int key,val,loc;
}t[MAXN];
struct tree
{
	int lc,rc,key,siz,val;
}a[MAXN];
void insert(int &o,int k,int fa)
{
	if(!o)
	{
		o=++cnt;
		++tot;
		a[o]=(tree){0,0,k,1,1};
		return;
	}
	++a[o].siz;
	if(k==a[o].key)++a[o].val;
	else if(k<a[o].key)insert(a[o].lc,k,o);
	else insert(a[o].rc,k,o);
	int lc=a[o].lc,rc=a[o].rc;
	a[o].siz=a[lc].siz+a[rc].siz+a[o].val;
	if(a[lc].siz>=a[rc].siz*3||a[rc].siz>=a[lc].siz*3)
	{
		last=fa;
		lastt=a[fa].lc==o;
	}
	return;
}
void del(int &o,int k)
{
	if(!o)return;
	if(k==a[o].key)
	{
		if(a[o].val>0)
		{
			--a[o].siz;
			--a[o].val;
			++totdel;
		}
		return;
	}
	else if(k<a[o].key)
	{
		--a[o].siz;
		del(a[o].lc,k);
	}
	else
	{
		--a[o].siz;
		del(a[o].rc,k);
	}
	return;
}
int query_rank(int o,int k)
{
	if(!o)return 0;
	if(k<a[o].key)return query_rank(a[o].lc,k);
	if(k==a[o].key)return a[a[o].lc].siz+1;
	return a[a[o].lc].siz+a[o].val+query_rank(a[o].rc,k);
}
int query_num(int o,int k)
{
	if(!o)return 0;
	if(k<=a[a[o].lc].siz)return query_num(a[o].lc,k);
	if(k<=a[a[o].lc].siz+a[o].val)return a[o].key;
	return query_num(a[o].rc,k-a[a[o].lc].siz-a[o].val);
}
void query_pro(int o,int k)
{
	if(!o)return;
	if(k<=a[o].key)query_pro(a[o].lc,k);
	else
	{
		if(a[o].val)ret=max(ret,a[o].key);
		else query_pro(a[o].lc,k);
		query_pro(a[o].rc,k);
	}
	return;
}
void query_sub(int o,int k)
{
	if(!o)return;
	if(k>=a[o].key)query_sub(a[o].rc,k);
	else
	{
		if(a[o].val)ret=min(ret,a[o].key);
		else query_sub(a[o].rc,k);
		query_sub(a[o].lc,k);
	}
	return;
}
void dfs(int o)
{
	if(a[o].lc)dfs(a[o].lc);
	if(a[o].val)t[++cou]=(temp){a[o].key,a[o].val,o};
	else
	{
		--tot;
		--totdel;
	}
	if(a[o].rc)dfs(a[o].rc);
	return;
}
int build(int l,int r)
{
	if(l>r)return 0;
	int mid=(l+r)>>1;
	int o=t[mid].loc;
	a[o].lc=build(l,mid-1);
	a[o].rc=build(mid+1,r);
	a[o].key=t[mid].key;
	a[o].val=t[mid].val;
	a[o].siz=a[a[o].lc].siz+a[a[o].rc].siz+a[o].val;
	return o;
}
void rebuild(int &k)
{
	cou=0;
	dfs(k);
	k=build(1,cou);
	return;
}
int main()
{
	scanf("%d",&n);
	int t1,t2;
	for(int i=1;i<=n;++i)
	{
		scanf("%d%d",&t1,&t2);
		if(t1==1)
		{
			last=0;
			insert(root,t2,-1);
			if(last)
			{
				if(last==-1)rebuild(root);
				else
				{
					if(lastt)rebuild(a[last].lc);
					else rebuild(a[last].rc);
				}
			}
		}
		else if(t1==2)
		{
			del(root,t2);
			if(totdel*2>tot)rebuild(root);
		}
		else if(t1==3)printf("%d\n",query_rank(root,t2));
		else if(t1==4)printf("%d\n",query_num(root,t2));
		else if(t1==5)
		{
			ret=-INF;
			query_pro(root,t2);
			printf("%d\n",ret);
		}
		else
		{
			ret=INF;
			query_sub(root,t2);
			printf("%d\n",ret);
		}
	}
	return 0;
}
